package com.common.config;

import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * <p>RedisConfig 此类用于：Redis相关配置，用于解决存入Redis中值乱码问题 </p>
 * @Classname RedisConfig
 * @Date 2023/7/31 14:43
 * @Created ZFC
 */
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
    /**
     * 如果key和value都使用的StringRedisSerializer序列化器，则推荐使用StringRedisTemplate
     *
     * 配置Redis的Key和Value的序列化器
     * @param redisTemplate 从容器中获取RedisTemplate
     * @return 修改后的RedisTemple
     */
    @Bean
    public RedisTemplate<Object, Object> redisStringTemplate(RedisTemplate<Object, Object> redisTemplate) throws InterruptedException {
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringRedisSerializer);
        // 如果手动将Value转换成了JSON，就不要再用JSON序列化器了。
        // redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
        redisTemplate.setValueSerializer(stringRedisSerializer);

        /**
         * 这是一个 Java Spring Boot 应用程序中的 RedisTemplate 配置类，用于配置 RedisTemplate 实例的序列化器（serializer）。
         * 在 Redis 中，所有的数据都是二进制的。当我们将数据存储到 Redis 中时，需要将其序列化为二进制格式。而当我们从 Redis 中获取数据时，需要将其反序列化为原始数据格式。
         * 在这个配置类中，我们使用了 StringRedisSerializer 作为 Key 和 Value 的序列化器。这意味着，我们在将数据存储到 Redis 中时，将 Key 和 Value 转换为字符串格式，并将其序列化为二进制格式。当我们从 Redis 中获取数据时，将其反序列化为字符串格式，并将其转换为原始数据格式。
         * 需要注意的是，如果我们手动将 Value 转换成了 JSON 格式，就不要再使用 Jackson2JsonRedisSerializer 序列化器了，因为这会导致 JSON 格式的数据再次被序列化为二进制格式，从而导致数据格式错误。
         */
        return redisTemplate;
    }
}
